//
//  UITextView+Emoticon.swift
//  表情键盘
//
//  Created by WGP on 16/4/22.
//  Copyright © 2016年 WGP. All rights reserved.
//

import UIKit

extension UITextView
{
    ///获取textView带表情名称的文本
    func emoticonText() -> String
    {
        var strM = ""
        /// 属性文本会分段保存.普通文本一段, emoji是一段, 附件是一段
        /// 获取属性文本中的每一段
        self.attributedText.enumerateAttributesInRange(NSRange(location: 0, length: self.attributedText.length), options: []) { (dict, range, _) -> Void in
            // 每当获取到一段内容就会调用闭包一次
            // 会返回每段的range
            // 图片表情 dict里面会包含 NSAttachment key, 获取图片表情的名称
            if let attachment = dict["NSAttachment"] as? HMTextAttachment {
                // 附件 chs
                strM += attachment.chs!
            } else {
                // 普通文本和emoji表情,直接截取获取对应的内容range
                let text = (self.attributedText.string as NSString).substringWithRange(range)
                
                // 将截取的文本拼接起来
                strM += text
            }
        }
        
        return strM
    }
    
    ///将模型的内容添加到textView上面
    func insertEmoticon(emoticon: HMEmoticonModel)
    {
        // 1.emoji表情
        if let emoji = emoticon.emoji {
            insertText(emoji)
            return
        }
        
        // 2.图片表情
        if let png = emoticon.fullPngPath {
            // 将图片添加textView, textView可以显示属性文本
            // 1.将图片添加到附件
            let attachment = HMTextAttachment()
            attachment.image = UIImage(named: png)
            
            // 把模型对应的名称发到附件中
            attachment.chs = emoticon.chs
            
            // 1.1设置附件的bounds
            let wh = font?.lineHeight ?? 15
            // bounds.y 和 frame.y: frame往下走y是正数, bounds往下走y是负数
            attachment.bounds = CGRect(x: 0, y: -5, width: wh, height: wh)
            
            // 2.将附件转成属性文本
            let attrM = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            // 2.1 附件没有font属性跟在他后面的图片就会变的很小
            attrM.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            
            // 2.2将带 图片的属性文本 ,替换现有文本光标位置
            let currentText = NSMutableAttributedString(attributedString: attributedText)
            
            // 当前光标的位置
            let currentSelectedRange = selectedRange
            
            currentText.replaceCharactersInRange(currentSelectedRange, withAttributedString: attrM)
            
            // 3.textView设置属性文本
            attributedText = currentText
            
            // 设置光标的位置
            selectedRange = NSRange(location: currentSelectedRange.location + 1, length: 0)
        }
    }
}


